package com.liliudong.template.biz.service.sys;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.liliudong.template.common.dto.sys.SysMenuAddOrUpdateDTO;
import com.liliudong.template.common.dto.sys.SysMenuImportDTO;
import com.liliudong.template.common.entity.sys.SysMenu;
import com.liliudong.template.common.vo.sys.SysMenuDetailVO;

import java.util.Collection;
import java.util.List;
import java.util.Set;

public interface SysMenuService extends IService<SysMenu>{

	/**
	 * 按角色列出id忽略数据权限
	 *
	 * @param roleIds 角色ID
	 * @return {@link List }<{@link SysMenu }>
	 */
	List<SysMenu> listByRoleIdsIgnoreDataPermission(Collection<Long> roleIds);

	/**
	 * 按角色列出权限id忽略数据权限
	 *
	 * @param roleIds      角色ID
	 * @return {@link Set }<{@link String }>
	 */
	Set<String> listPermissionByRoleIdsIgnoreDataPermission(Set<Long> roleIds);

	/**
	 * 列表权限忽略数据权限
	 *
	 * @return {@link Set }<{@link String }>
	 */
	Set<String> listPermissionIgnoreDataPermission();

	/**
	 * 列表忽略数据权限
	 *
	 * @return {@link List }<{@link SysMenu }>
	 */
	List<SysMenu> listIgnoreDataPermission();

	/**
	 * 添加一个
	 *
	 * @param sysMenuAddOrUpdateDTO 系统菜单添加或更新dto
	 */
	void addOne(SysMenuAddOrUpdateDTO sysMenuAddOrUpdateDTO);

	/**
	 * 按id删除
	 *
	 * @param id 身份证件
	 */
	void deleteById(Long id);

	/**
	 * 按id修改
	 *
	 * @param id                    身份证件
	 * @param sysMenuAddOrUpdateDTO 系统菜单添加或更新dto
	 */
	void modifyById(Long id, SysMenuAddOrUpdateDTO sysMenuAddOrUpdateDTO);

	/**
	 * 查询树
	 *
	 * @return {@link List }<{@link Tree }<{@link Long }>>
	 */
	List<Tree<Long>> queryTree();

	/**
	 * 菜单转换为树
	 *
	 * @param sysMenus 系统菜单
	 * @return {@link List }<{@link Tree }<{@link Long }>>
	 */
	List<Tree<Long>> menus2Tree(List<SysMenu> sysMenus);

	/**
	 * id明细
	 *
	 * @param id 身份证件
	 * @return {@link SysMenuDetailVO }
	 */
	SysMenuDetailVO detailById(Long id);

	/**
	 * 角色ID可见列表忽略数据权限
	 *
	 * @param roleIds 角色ID
	 * @return {@link Collection }<{@link SysMenu }>
	 */
	List<SysMenu> listVisibleByRoleIdsIgnoreDataPermission(Collection<Long> roleIds);

	/**
	 * 批量导入
	 *
	 * @param sysMenuImportDTO 系统菜单导入dtolist
	 */
	void importBatch(SysMenuImportDTO sysMenuImportDTO);
}
